home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / 3dvect39 / gsp669.asm < prev    next >
Assembly Source File  |  1994-10-30  |  9KB  |  295 lines

  1. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  2. ; Modified Simple 669 playback routine using 'gus' lowlevel GUS routines.
  3. ;
  4. ; The IRQ is expected to call this routine 50 times a second.  Why, Because!
  5. ; Anyway, that means that .669's that have a tempo of 4 are played a little
  6. ; faster than you would expect.  All other tempos sound fine.
  7. ;
  8. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  9.  
  10.          .386p
  11. code32   segment para public use32
  12.          assume cs:code32, ds:code32
  13.  
  14. include  pmode.ext
  15. include  gus.ext
  16. include  irq.ext
  17.  
  18. public   _ord669
  19.  
  20. public   _muzloc, _muzend, _muzrow, _muzord, _muzloop, _muzeord
  21.  
  22. public   _gsp669_init, _gsp669_uninit, _gsp669_load, _gsp669_play, _gsp669_stop
  23.  
  24. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  25. ; DATA
  26. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  27. align    4
  28. ordptr     dd ?                             ; ptr to order list
  29. tempoptr   dd ?                             ; ptr to tempo list
  30. breakptr   dd ?                             ; ptr to break list
  31. patbaseptr dd ?                             ; ptr to base of patterns
  32. instptr    dd ?                             ; ptr to sample data
  33.  
  34. currowptr dd ?                              ; ptr to next row to play
  35.  
  36. _muzloc  label word                         ; ord:row
  37. _muzrow  db ?                               ; current row playing
  38. _muzord  db ?                               ; current order playing
  39. _muzend  label word                         ; end:loop
  40. _muzloop db ?                               ; loop point of 669
  41. _muzeord db ?                               ; last+1 order of 669
  42.  
  43. panloc   db 0                               ; base of ping-pong pan
  44. tempo    db ?                               ; tempo
  45. tempoc   db ?                               ; tempo counter
  46. row      db ?                               ; current row
  47. _ord669  db ?                               ; current order
  48. break    db ?                               ; row of break
  49.  
  50. which669control dd -1                       ; irq timing control number
  51.  
  52. pantbl   db 3,3,3,4,4,5,6,7,8,9,10,11,11,12,12,12
  53.          db 12,12,12,11,11,10,9,8,7,6,5,4,4,3,3,3
  54.          db 3,3,3,4,4,5,6,7,8,9,10,11,11,12,12,12
  55.          db 12,12,12,11,11,10,9,8,7,6,5,4,4,3,3,3
  56.          db 3,3,3,4,4,5,6,7,8,9,10,11,11,12,12,12
  57.          db 12,12,12,11,11,10,9,8,7,6,5,4,4,3,3,3
  58.          db 3,3,3,4,4,5,6,7,8,9,10,11,11,12,12,12
  59.          db 12,12,12,11,11,10,9,8,7,6,5,4
  60.  
  61. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  62. ; CODE
  63. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  64.  
  65. ;═════════════════════════════════════════════════════════════════════════════
  66. ; Main playback routine called by GUS IRQ routine
  67. mr:
  68.          mov al,tempoc
  69.          dec al
  70.          jnz mrd
  71.  
  72.          mov esi,currowptr
  73.          mov ax,word ptr row
  74.          inc al
  75.          cmp al,break
  76.          jbe short mrf0
  77.          xor al,al
  78.          inc ah
  79.          cmp ah,_muzeord
  80.          jbe short mrf1
  81.          mov ah,_muzloop
  82. mrf1:
  83.          movzx ebp,ah
  84.          mov edi,ordptr
  85.          movzx esi,byte ptr ds:[ebp+edi]
  86.          mov edi,tempoptr
  87.          mov bl,[edi+esi]
  88.          mov tempo,bl
  89.          mov edi,breakptr
  90.          mov bl,[edi+esi]
  91.          mov break,bl
  92.          lea esi,[esi*2+esi]
  93.          shl esi,9
  94.          add esi,patbaseptr
  95. mrf0:
  96.          mov word ptr row,ax
  97.          mov _muzloc,ax
  98.  
  99.          movzx edx,panloc
  100.          inc dl
  101.          and dl,3fh
  102.          mov panloc,dl
  103.          mov edi,instptr
  104.          mov ebp,7
  105. mrl0:
  106.          mov al,[esi+2]
  107.          mov ah,al
  108.          and al,0f0h
  109.          cmp al,50h
  110.          jne short mrl0f0
  111.          and ah,0fh
  112.          mov tempo,ah
  113. mrl0f0:
  114.          mov bl,pantbl[edx+ebp*4]
  115.          mov _vcpan[ebp],bl
  116.          or _vccmnd[ebp],2
  117.          mov ax,[esi]
  118.          cmp al,0feh
  119.          ja mrl0c
  120.          movzx ebx,ah
  121.          and bl,0fh
  122.          mov _vcvol[ebp],bl
  123.          or _vccmnd[ebp],1
  124.          cmp al,0feh
  125.          je short mrl0c
  126.          xchg al,ah
  127.          shr ax,2
  128.          shr al,2
  129.          movzx ebx,ah
  130.          mov bx,_freqtbl[ebx*2]
  131.          mov _vcfreq[ebp*2],bx
  132.          movzx ebx,al
  133.          lea ebx,[ebx*4+ebx]
  134.          lea ebx,[ebx*4+ebx]
  135.          mov al,[edi+ebx+12]
  136.          mov _vccntrl[ebp],al
  137.          mov eax,[edi+ebx+13]
  138.          mov _vcsbeg[ebp*4],eax
  139.          mov eax,[edi+ebx+17]
  140.          mov _vclbeg[ebp*4],eax
  141.          mov eax,[edi+ebx+21]
  142.          mov _vclend[ebp*4],eax
  143.          mov _vccmnd[ebp],play
  144. mrl0c:
  145.          add esi,3
  146.          sub ebp,1
  147.          jnc mrl0
  148.  
  149.          mov currowptr,esi
  150.          xor eax,eax
  151.          mov ah,tempo
  152.          mov ecx,eax
  153.          shr ecx,1
  154.          add eax,ecx
  155.          shr ecx,2
  156.          add eax,ecx
  157.          shr ecx,2
  158.          add eax,ecx
  159.          add eax,128
  160.          mov al,ah
  161. mrd:
  162.          mov tempoc,al
  163.          ret
  164.  
  165. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  166. ; Init 669 player and low level gus crap
  167. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  168. _gsp669_init:
  169.          ret
  170.  
  171. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  172. ; Reset 669 player and low level gus crap
  173. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  174. _gsp669_uninit:
  175.          call _gsp669_stop
  176.          ret
  177.  
  178. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  179. ; Load a 669, samples go directly into GUS ram
  180. ; In:
  181. ;   EAX -> stream input routine (In:ECX=len,EDX->buf, Out:EAX=len,CF=1 error)
  182. ;   EDX -> buffer large enough for all music data plus largest sample
  183. ; _sfxmem -> location to begin storing on GUS memory
  184. ; Out:
  185. ;   EAX - number of bytes of buffer to keep
  186. ;   EBX - number of bytes used on GUS
  187. ; _sfxmem -> next free GUS memory location
  188. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  189. _gsp669_load:
  190.          pushad
  191.          mov ebp,edx
  192.          mov ecx,1f1h
  193.          call eax
  194.          mov al,[edx+70h]
  195.          mov _muzloop,al
  196.          lea eax,[edx+71h]
  197.          mov ordptr,eax
  198.          add eax,80h
  199.          mov tempoptr,eax
  200.          add eax,80h
  201.          mov breakptr,eax
  202.          add edx,ecx
  203.          mov instptr,edx
  204.          lea esi,[edx+13]
  205.          movzx edi,byte ptr [ebp+6eh]
  206.          imul ecx,edi,25
  207.          call dword ptr [esp+28]
  208.          add edx,ecx
  209.          mov patbaseptr,edx
  210.          movzx ecx,byte ptr [ebp+6fh]
  211.          lea ecx,[ecx*2+ecx]
  212.          shl ecx,9
  213.          call dword ptr [esp+28]
  214.          add edx,ecx
  215.          mov ebx,_sfxmem
  216. gsp669loadl0:
  217.          mov ecx,[esi]
  218.          add esi,25
  219.          jecxz gsp669loadl0c
  220.          call dword ptr [esp+28]
  221.          call _sfx_putram
  222.          add ebx,ecx
  223. gsp669loadl0c:
  224.          dec edi
  225.          jnz gsp669loadl0
  226.          sub edx,[esp+20]
  227.          mov [esp+28],edx
  228.          mov [esp+16],ebx                   ; save amount of GUS ram used for samples
  229.          add _sfxmem,ebx
  230.  
  231.          mov esi,instptr
  232.          movzx ecx,byte ptr [ebp+6eh]
  233.          xor ebx,ebx
  234. gsp669loadl1:
  235.          mov edx,[esi+13]
  236.          mov [esi+13],ebx
  237.          mov al,8
  238.          cmp edx,[esi+21]
  239.          jae short gsp669loadl1c
  240.          xor al,al
  241.          mov [esi+21],edx
  242. gsp669loadl1c:
  243.          add [esi+17],ebx
  244.          add [esi+21],ebx
  245.          dec dword ptr [esi+21]
  246.          mov [esi+12],al
  247.          add ebx,edx
  248.          add esi,25
  249.          loop gsp669loadl1
  250.  
  251.          popad
  252.          ret
  253.  
  254. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  255. ; Play a loaded 669
  256. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  257. _gsp669_play:
  258.          push ax ecx edi
  259.          call _gsp669_stop
  260.          mov edi,ordptr
  261.          mov ecx,80h
  262.          mov al,0ffh
  263.          repne scasb
  264.          sub cl,7eh
  265.          neg cl
  266.          mov _muzeord,cl
  267.          mov _muzloc,0
  268.          mov panloc,0
  269.          mov dword ptr tempoc,0ff0001h
  270.          mov which669control,-1
  271.          call _irq_findcontrol
  272.          jc gspno669
  273.          mov _irqcontrol[ecx*4],offset mr
  274.          mov which669control,ecx
  275. gspno669:
  276.          pop edi ecx ax
  277.          ret
  278.  
  279. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  280. ; Stop playback
  281. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  282. _gsp669_stop:
  283.          mov dword ptr _vcvol[0],0000000h
  284.          mov dword ptr _vcvol[4],0000000h
  285.          mov dword ptr _vccmnd[0],20202020h
  286.          mov dword ptr _vccmnd[4],20202020h
  287.          mov ecx,which669control
  288.          or ecx,ecx
  289.          jl _ret
  290.          mov _irqcontrol[ecx*4],offset _ret
  291.          ret
  292.  
  293. code32   ends
  294.          end
  295.